package com.hadoop.mapreduce.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;
/**
 * KEYIN: 默认情况下，是mr框架所读到的一行文本的起始偏移量，Long,
 * 但是在hadoop中有自己的更精简的序列化接口，所以不直接用Long，而用LongWritable
 *
 * VALUEIN:默认情况下，是mr框架所读到的一行文本的内容，String，同上，用Text
 *
 * KEYOUT：是用户自定义逻辑处理完成之后输出数据中的key，在此处是单词，String，同上，用Text
 * VALUEOUT：是用户自定义逻辑处理完成之后输出数据中的value，在此处是单词次数，Integer，同上，用IntWritable
 * @author
 */
public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
    /**
     * map阶段的业务逻辑写在就写在map方法中
     * maptask会对每一行输入调用一次自定义的map方法
     * @param key   这一行的起始点在文件中的偏移量
     * @param value 这一行的内容
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //拿到一行数据转换为string,将这一行切分出各个单词
        String[] strings = value.toString().split(" ");
        for (String s:
             strings) {
            //遍历数组，输出<单词，1>
            context.write(new Text(s),new IntWritable(1));
        }
    }
}
